package com.zouxw.utils.json.utils;

import javax.swing.Timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.function.Consumer;

/**
 * 防抖工具类
 * 用于优化频繁触发的事件，避免过度执行
 * 
 * @author zouxw
 * @version 1.0
 */
public class DebounceUtil {
    
    // ==================== 私有构造函数 ====================
    /**
     * 私有构造函数，防止实例化
     */
    private DebounceUtil() {
        throw new UnsupportedOperationException("防抖工具类不能被实例化");
    }
    
    // ==================== 公共方法 ====================
    
    /**
     * 创建防抖执行器
     * 
     * @param delay 延迟时间（毫秒）
     * @param action 要执行的操作
     * @return 防抖执行器
     */
    public static DebounceExecutor create(int delay, Runnable action) {
        return new DebounceExecutor(delay, action);
    }
    
    /**
     * 创建带参数的防抖执行器
     * 
     * @param delay 延迟时间（毫秒）
     * @param action 要执行的操作
     * @param <T> 参数类型
     * @return 防抖执行器
     */
    public static <T> DebounceExecutorWithParam<T> create(int delay, Consumer<T> action) {
        return new DebounceExecutorWithParam<>(delay, action);
    }
    
    // ==================== 内部类 ====================
    
    /**
     * 防抖执行器
     */
    public static class DebounceExecutor {
        private final int delay;
        private final Runnable action;
        private Timer timer;
        
        /**
         * 构造函数
         * 
         * @param delay 延迟时间（毫秒）
         * @param action 要执行的操作
         */
        public DebounceExecutor(int delay, Runnable action) {
            this.delay = delay;
            this.action = action;
        }
        
        /**
         * 执行防抖操作
         */
        public void execute() {
            if (timer != null) {
                timer.stop();
            }
            
            timer = new Timer(delay, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    action.run();
                    timer.stop();
                }
            });
            timer.setRepeats(false);
            timer.start();
        }
        
        /**
         * 取消执行
         */
        public void cancel() {
            if (timer != null) {
                timer.stop();
            }
        }
        
        /**
         * 立即执行（取消防抖）
         */
        public void executeNow() {
            cancel();
            action.run();
        }
    }
    
    /**
     * 带参数的防抖执行器
     * 
     * @param <T> 参数类型
     */
    public static class DebounceExecutorWithParam<T> {
        private final int delay;
        private final Consumer<T> action;
        private Timer timer;
        private T lastParam;
        
        /**
         * 构造函数
         * 
         * @param delay 延迟时间（毫秒）
         * @param action 要执行的操作
         */
        public DebounceExecutorWithParam(int delay, Consumer<T> action) {
            this.delay = delay;
            this.action = action;
        }
        
        /**
         * 执行防抖操作
         * 
         * @param param 参数
         */
        public void execute(T param) {
            this.lastParam = param;
            
            if (timer != null) {
                timer.stop();
            }
            
            timer = new Timer(delay, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    action.accept(lastParam);
                    timer.stop();
                }
            });
            timer.setRepeats(false);
            timer.start();
        }
        
        /**
         * 取消执行
         */
        public void cancel() {
            if (timer != null) {
                timer.stop();
            }
        }
        
        /**
         * 立即执行（取消防抖）
         * 
         * @param param 参数
         */
        public void executeNow(T param) {
            cancel();
            action.accept(param);
        }
    }
}
